using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

using RRHH.Competencias.DataAccessLayer.Generic;
using RRHH.Competencias.DataAccessLayer.SqlServerProvider;
using RRHH.Competencias.Entities;

namespace RRHH.Competencias.DataAccessLayer
{
    public class DALSqlServerSector:IDALSector
    {
        
        public DALSqlServerSector()
        {
        
        }

        #region Miembros de IDALABM<Ciclo>

        public void Completar(Sector itemCompletar)
        {
            List<Sector> sectores = Buscar(itemCompletar.Id, null, null, null, false);
            if (sectores.Count > 0)
            {
                itemCompletar.Nombre = sectores[0].Nombre;
                itemCompletar.Descripcion = sectores[0].Descripcion;
                itemCompletar.Responsable = sectores[0].Responsable;
            }
            else
            {
                throw new Exception("No se pudo completar");
            }
        }

        public void Guardar(Sector item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Sector_insertar");
            stored.AgregarParametro("@nombre", item.Nombre);
            stored.AgregarParametro("@descripcion", item.Descripcion);
            if (item.Responsable != null) stored.AgregarParametro("@colaborador_id", item.Responsable.IdColaborador);
            else stored.AgregarParametro("@colaborador_id", null, typeof(long));
            item.Id = Convert.ToInt64(stored.ExecuteScalar());
        }


        public void GuardarOActualizar(Sector item)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public void Actualizar(Sector item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Sector_actualizar");
            stored.AgregarParametro("@sector_id", item.Id);
            stored.AgregarParametro("@nombre", item.Nombre);
            stored.AgregarParametro("@descripcion", item.Descripcion);
            if(item.Responsable != null)
                stored.AgregarParametro("@colaborador_id", item.Responsable.IdColaborador);
            else
                stored.AgregarParametro("@colaborador_id", DBNull.Value, typeof(long));
            stored.ExecuteNonQuery();
        }

        public void Borrar(Sector item)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        /// <summary>
        /// Activa el Ciclo determinado, coloca la fecha de baja en NULL
        /// </summary>
        /// <param name="item">
        /// Ciclo que se va a Activar.
        /// </param>
        public void Activar(Sector item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Sector_Activar");
            stored.AgregarParametro("@sector_id", item.Id);
            stored.ExecuteNonQuery(); 
        }

        /// <summary>
        /// Desactiva el Ciclo determinado, coloca en la fecha de baja la fecha actual
        /// </summary>
        /// <param name="item">
        /// Ciclo que se va a Desactivar.
        /// </param>
        public void Desactivar(Sector item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Sector_desactivar");
            stored.AgregarParametro("@sector_id", item.Id);
            stored.ExecuteNonQuery(); 
        }

        public List<Sector> BuscarTodos()
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Sector_buscarTodos");
            stored.AgregarParametro( "@soloActivos", true );
            DataTable dtSector = new DataTable();
            dtSector = stored.ExecuteDataTable();

            return CargarLista(dtSector);
        }

        public List<Sector> BuscarTodos (bool soloActivos)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure( "PA_ADUS_Sector_buscarTodos" );
            stored.AgregarParametro("@soloActivos", soloActivos);
            DataTable dtSector = new DataTable();
            dtSector = stored.ExecuteDataTable();

            return CargarLista( dtSector );
        }

        public List<Sector> Buscar(long? ciclo_id, string nombre, string descripcion, long? colaborador_id, bool activo)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Sector_buscar");
            stored.AgregarParametro("@sector_id", ciclo_id, typeof(long));
            stored.AgregarParametro("@nombre", nombre, typeof(string));
            stored.AgregarParametro("@descripcion", descripcion, typeof(string));
            stored.AgregarParametro("@soloActivos", activo, typeof(bool));
            stored.AgregarParametro("@colaborador_id", colaborador_id, typeof(long));

            DataTable dtSector = new DataTable();
            dtSector = stored.ExecuteDataTable();

            return CargarLista(dtSector);
        }



        private List<Sector> CargarLista(DataTable dt)
        {
            List<Sector> lstCiclos = new List<Sector>();
            
            foreach (DataRow dRow in dt.Rows)
            {
                Sector sector = new Sector();

                if (!dRow["sector_id"].Equals(DBNull.Value)) sector.Id = Convert.ToInt64(dRow["sector_id"]);
                if (!dRow["nombre"].Equals(DBNull.Value)) sector.Nombre = dRow["nombre"].ToString();
                if (!dRow["descripcion"].Equals(DBNull.Value)) sector.Descripcion = dRow["descripcion"].ToString();
                if (!dRow["fechaBaja"].Equals(DBNull.Value)) sector.FechaBaja = Convert.ToDateTime(dRow["fechaBaja"]);
                if (!dRow["colaborador_id"].Equals(DBNull.Value))
                {
                    sector.Responsable = new Colaborador();
                    sector.Responsable.IdColaborador = Convert.ToInt64(dRow["colaborador_id"]);
                }
                
                
                lstCiclos.Add(sector);
            }

            return lstCiclos;
        }

        #endregion
    }
}
